home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-07-08 | 52.2 KB | 1,611 lines |
- ;valid $Id: d_tankleak.pro,v 1.26 1997/04/28 21:12:36 alan Exp $
- ;
- ; Copyright (c) 1997, Research Systems, Inc. All rights reserved.
- ; Unauthorized reproduction prohibited.
- ;
- ;+
- ; FILE:
- ; d_tankleak.pro
- ;
- ; CALLING SEQUENCE: d_tankleak
- ;
- ; PURPOSE: Shows the contamination of leaky tanks.
- ;
- ; MAJOR TOPICS: Visualization
- ;
- ; CATEGORY:
- ; IDL 5.0
- ;
- ; INTERNAL FUNCTIONS and proCEDURES:
- ; fun index_color2rgb - Cnage the color index into RGB
- ; fun read_bores - Read bore holes data
- ; pro em_win3D_event - Drawing area event handler
- ; pro em_volume_bounds - Draw the volume
- ; fun em_extent_bounds - Drawing a box (event handler)
- ; pro em_gen_iso - Compute the isosurface
- ; pro em_menu_event - menu bar event handler
- ; pro em_option_event - option event handler
- ; pro em_view_event - view event handler
- ; pro d_tankleak_event - main event handler
- ; pro d_tankleak_Cleanup - Cleanup
- ; pro d_tankleak - Main procedure
- ;
- ; EXTERNAL FUNCTIONS, proCEDURES, and FILES:
- ; pro trackball__define - Create the trackball object
- ; fun gettips - REad the tip file
- ; fun widtips - Create the tip widgets
- ; fun sizetips - Size the tip widgets
- ; vol1.sav
- ; vol2.sav
- ; bores0.dat
- ; tanks.gif
- ; tankleak.txt
- ; tankleak.tip
- ;
- ; REFERENCE: IDL Reference Guide, IDL User's Guide
- ;
- ; NAMED STRUCTURES:
- ; none.
- ;
- ; COMMON BLOCS:
- ; none.
- ;
- ; MODifICATION HISTORY: WRITTEN, SDG, RSI, DEC, 1996.
- ;
- ;-
- ;-----------------------------------------------------------
- ;
- ; PURPOSE Convert an array of index color
- ; to an array of RGB color. The function returns
- ; the RGB colr array.
- ;
- function index_color2rgb, $
- index_color, $ ; IN: array of index colors to convert
- range ; IN: range of the color wheel
- ; to use for the conversion
-
- ; Find min index_color.
- ;
- imin = FLOAT(MIN(index_color, MAX=imax))
-
- hue = range * (index_color-imin) / (imax-imin)
- sat = 1.0
- val = 1.0
- n = N_ELEMENTS(hue)
- color_convert, hue, REPLICATE(sat, n), REPLICATE(val,n), $
- r,g,b, /HSV_RGB
-
- RETURN, TRANSPOSE([[r],[g],[b]])
-
- end ; end function vert_col
-
-
- ;-----------------------------------------------------------
- ;
- ; PURPOSE Read a bore hole file
- ;
- function read_bores, $
- file_lun, $ ; IN: file lun
- parent_obj, $ ; IN: parent object
- color ; IN: assigned color
-
- ; Read the title string.
- ;
- title = ' '
- READF, file_lun, title
-
- ; Read the number of boreholes.
- ;
- num_bores = 0
- READF, file_lun, num_bores
- num_points = 0
- READF, file_lun, num_points
-
- x_coords = FLTARR(num_bores * num_points)
- y_coords = FLTARR(num_bores * num_points)
- z_coords = FLTARR(num_bores * num_points)
- elem1 = FLTARR(num_bores * num_points)
- elem2 = FLTARR(num_bores * num_points)
- vert_col1 = INTARR(3,num_bores * num_points)
- vert_col2 = INTARR(3,num_bores * num_points)
- pl_num = num_points + 1
- pl = INTARR(num_bores * pl_num)
- counter = 0
-
- x = 0.0
- y = 0.0
- z = 0.0
- val1 = 0.0
- val2 = 0.0
- bore_number = 0
-
- for i = 0, num_bores-1 do begin
-
- ; Read the number of boreholes.
- ;
- READF, file_lun, bore_number
-
- pl[i*pl_num] = num_points
- for j = 0, num_points-1 do begin
- READF, file_lun, x, y, z, val1, val2
- x_coords[counter] = x
- y_coords[counter] = y
- z_coords[counter] = z
- elem1[counter] = val1
- elem2[counter] = val2
- pl[i*pl_num + j + 1] = counter
- counter = counter + 1
- endfor ; for j
-
- endfor ; for i
-
- ; Compute the vertex colors for the polylines
- ;
- vert_col1 = index_color2rgb(elem1,225.0)
-
- vert_col2 = index_color2rgb(elem2,225.0)
-
- ; Create the bores holes colored with
- ; the first element: element1.
- ;
- bore_obj = OBJ_NEW('IDLgrModel')
- parent_obj->Add, bore_obj
-
- bore_obj_pl = OBJ_NEW('IDLgrPolyline', x_coords, y_coords, z_coords, $
- POLYLINES=pl, THICK=2, VERT_COLOR=vert_col1)
-
- bore_obj->Add, bore_obj_pl
-
- ; Return the bore object model.
- ;
- RETURN, bore_obj
-
- end ; End read_bore
-
- ;----------------------------------------------------------------------------
- ;
- ; Purpose: Handle rotations, quit on any button except left.
- ;
- pro em_win3d_event, $
- sEvent ; IN: event sturcture
-
- WIDGET_CONTROL, sEvent.id, GET_UVALUE=uval, /NO_COPY
-
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
-
-
- ; Expose.
- ;
- if (sEvent.type eq 4) then begin
- state.oWindow->Draw, state.oView
- endif
-
- ; Handle trackball update.
- ;
- bHaveTransform = state.oTrack->Update(sEvent, TRANSFORM=qmat )
- if (bHaveTransform NE 0) then begin
- state.top3D->GetProperty, TRANSFORM=t
- mt = t # qmat
- state.top3D->SetProperty,TRANSFORM=mt
- endif
-
- ; Button press event.
- ;
- if (sEvent.type EQ 0) then begin ; Button press.
- state.btnDown = 1B
- state.oWindow->SetProperty, QUALITY=state.dragq ;Refresh quality
- WIDGET_CONTROL, sEvent.id, /DRAW_MOTION
- endif ; of Button press
-
- ; Button motion event.
- ;
- if ((sEvent.type eq 2) and (state.btndown eq 1b)) then begin
- if (bHaveTransform) then begin
- state.oWindow->Draw, state.oView
- endif
- endif ; end of Button motion
-
- ; Button release.
- ;
- if (sEvent.type eq 1) then begin
- state.btndown = 0b
- state.oWindow->SetProperty, QUALITY=2
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, sEvent.id, DRAW_MOTION=0
- endif ; end of Button release
-
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end
-
- ;----------------------------------------------------------------------------
- ;
- ; Purpose: Draw a box around a volume.
- ;
- pro em_volume_bounds, $
- volume, $ ; IN: volume data coordinates
- color ; IN: color of the box
-
- s = SIZE(volume)
-
- ; Plot bottom 4 lines.
- ;
- PLOTS, [0.0,s[1]], [0.0,0.0], [0.0,0.0], COLOR=color, /T3D
- PLOTS, [s[1],s[1]], [0.0,s[2]], [0.0,0.0], COLOR=color, /T3D
- PLOTS, [s[1],0.0], [s[2],s[2]], [0.0,0.0], COLOR=color, /T3D
- PLOTS, [0.0,0.0], [s[2],0.0], [0.0,0.0], COLOR=color, /T3D
-
- ; Plot top 4 lines.
- ;
- PLOTS, [0.0,s[1]], [0.0,0.0], [s[3],s[3]], COLOR=color, /T3D
- PLOTS, [s[1],s[1]], [0,s[2]], [s[3],s[3]], COLOR=color, /T3D
- PLOTS, [s[1],0.0], [s[2],s[2]], [s[3],s[3]], COLOR=color, /T3D
- PLOTS, [0.0,0.0], [s[2],0.0], [s[3],s[3]], COLOR=color, /T3D
-
- ; Plot vertical 4 lines.
- ;
- PLOTS, [0.0,0.0], [0.0,0.0], [0.0,s[3]], COLOR=color, /T3D
- PLOTS, [s[1],s[1]], [0.0,0.0], [0.0,s[3]], COLOR=color, /T3D
- PLOTS, [s[1],s[1]], [s[2],s[2]], [0.0,s[3]], COLOR=color, /T3D
- PLOTS, [0.0,0.0], [s[2],s[2]], [0.0,s[3]], COLOR=color, /T3D
-
- end ; em_volume_bounds
-
- ;----------------------------------------------------------------------------
- ;
- ; Purpose: Draw a box given extents.
- ;
- ; Exts = [xmin, xmax, ymin, ymax, zmin, zmax]
- ; Exts = [ 0 1 2 3 4 5 ]
- ;
- function em_extent_bounds, $
- exts, $ ; IN: extents vector (see above)
- parent_obj, $ ; IN: prent object of the box
- color1, $ ; IN: color of x axis
- color2, $ ; IN: color of y axis
- color3 ; IN: color of z axis
-
- xverts = [exts[0], exts[1], exts[1], exts[0], $
- exts[0], exts[1], exts[1], exts[0]]
- yverts = [exts[2], exts[2], exts[3], exts[3], $
- exts[2], exts[2], exts[3], exts[3]]
- zverts = [exts[4], exts[4], exts[4], exts[4], $
- exts[5], exts[5], exts[5], exts[5]]
-
- p1 = [5,0,1,2,3,0]
- p2 = [2,0,4, $
- 2,1,5, $
- 2,2,6, $
- 2,3,7]
- p3 = [5,4,5,6,7,4]
-
- pl = [5,0,1,2,3,0, $
- 5,4,5,6,7,4, $
- 2,0,4, $
- 2,1,5, $
- 2,2,6, $
- 2,3,7]
-
- box_obj = OBJ_NEW('IDLgrModel')
- parent_obj->Add, box_obj
-
- box_top = OBJ_NEW('IDLgrpolyline',xverts, yverts, zverts, $
- POLYLINES=p3,COLOR=color1)
- box_bot = OBJ_NEW('IDLgrpolyline',xverts, yverts, zverts, $
- POLYLINES=p1, COLOR=color3)
- box_sides = OBJ_NEW('IDLgrpolyline',xverts, yverts, zverts, $
- POLYLINES=p2, COLOR=color2)
-
- ; Add the parts of the box to the box_obj.
- ;
- box_obj->Add, box_top
- box_obj->Add, box_bot
- box_obj->Add, box_sides
-
- RETURN, box_obj
-
- end ; em_extent_bounds
-
- ;----------------------------------------------------------------------------
- ;
- ; Purpose: Generate the isosurface.
- ;
- pro em_gen_iso, $
- volume, $ ; IN: volume data
- colors, $ ; IN: vertex colors
- iso_value, $ ; IN: isometric value
- low, $ ; IN: lowest value to plot
- verts, $ ; IN: vertices coordinates
- polys, $ ; IN: polygons coordinates
- vert_color ; IN: vertices colors
-
- vert_COLOR=colors
-
- SHADE_VOLUME, volume, iso_value, LOW=low, verts, polys, $
- SHADES=vert_color
-
- end ; EM_GEN_ISO
-
- ;----------------------------------------------------------------------------
- ;
- ; Purpose: Main menu bar event handler.
- ;
- pro em_menu_event, $
- sEvent ; IN: event structure
-
- WIDGET_CONTROL, sEvent.id, GET_UVALUE=uval
-
- case uval of
-
- 'QUIT' : begin
- WIDGET_CONTROL, sEvent.top, /DESTROY
- end ; Case of QUIT
-
- 'INFO' : begin
- if (Xregistered('XDisplayFile') NE 0) then RETURN
-
- XDisplayFile, filepath('tankleak.txt', $
- SUBDIR=['examples','demo','demotext']), $
- DONE_BUTTON='Done', $
- TITLE="About Environmental Modeling", $
- GROUP=sEvent.top, WIDTH=55, HEIGHT=14
-
- end ; of INFO
-
- endcase ; of uval
-
- end ; end of em_menu_event
-
- ;----------------------------------------------------------------------------
- ;
- ; Purpose: Options menu event handler.
- ;
- pro em_option_event, $
- sEvent ; IN: event structure
-
- WIDGET_CONTROL, sEvent.id, GET_UVALUE=uval
-
- case uval of
-
- ; Set the shading to flat.
- ;
- 'FLAT': begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- WIDGET_CONTROL, state.wFlatButton, SENSITIVE=0
- WIDGET_CONTROL, state.wGouraudButton, SENSITIVE=1
- state.isosurface1->SetProperty, SHADING=0
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end; Case of FLAT
-
- ; Set the shading to Gouraud.
- ;
- 'GOURAUD': begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- WIDGET_CONTROL, state.wFlatButton, SENSITIVE=1
- WIDGET_CONTROL, state.wGouraudButton, SENSITIVE=0
- state.isosurface1->SetProperty, SHADING=1
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end; Case of GOURAUD
-
- ; Set the surface style to wire.
- ;
- 'WIRE': begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- state.isosurface1->SetProperty, STYLE=1
- WIDGET_CONTROL, state.wWireButton, SENSITIVE=0
- WIDGET_CONTROL, state.wSolidButton, SENSITIVE=1
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end; Case of WIRE
-
- ; Set the surface style to solid.
- ;
- 'SOLID': begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- state.isosurface1->SetProperty, STYLE=2
- WIDGET_CONTROL, state.wWireButton, SENSITIVE=1
- WIDGET_CONTROL, state.wSolidButton, SENSITIVE=0
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end; Case of SOLID
-
- endcase ; of uval
-
- end ; end of em_option_event
-
- ;----------------------------------------------------------------------------
- ;
- ; Purpose: Options menu event handler.
- ;
- pro em_view_event, $
- sEvent ; IN: event structure
-
- WIDGET_CONTROL, sEvent.id, GET_UVALUE=uval
-
- case uval of
-
- ; Hide or show the isosurfaces.
- ;
- 'ISO' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- if (state.iso_on EQ 1) then begin ; Currently ON so turn OFF
- HIDE=1
- state.iso_on = 0
- WIDGET_CONTROL,sEvent.id, SET_VALUE='Isosurface (off)'
- endif else begin ; Currently OFF so turn ON
- HIDE=0
- state.iso_on = 1
- WIDGET_CONTROL,sEvent.id, SET_VALUE='Isosurface (on)'
- endelse
-
- ; Update the view.
- ;
- state.isosurface1->SetProperty, HIDE=hide
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of ISO
-
- ; Hide or show the bore holes.
- ;
- 'BORES' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- if (state.bores_on EQ 1) then begin ; Currently ON so turn OFF
- HIDE=1
- state.bores_on = 0
- WIDGET_CONTROL,sEvent.id, SET_VALUE='BoreHoles (off)'
- endif else begin ; Currently OFF so turn ON
- HIDE=0
- state.bores_on = 1
- WIDGET_CONTROL,sEvent.id, SET_VALUE='BoreHoles (on)'
- endelse
-
- ; Update the view.
- ;
- state.bore_obj->SetProperty, HIDE=hide
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of BORES
-
- ; Hide or show the tanks.
- ;
- 'TANKS' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- if (state.tanks_on EQ 1) then begin ; Currently ON so turn OFF
- HIDE=1
- state.tanks_on = 0
- WIDGET_CONTROL,sEvent.id,SET_VALUE='Tanks (off)'
- endif else begin ; Currently OFF so turn ON
- HIDE=0
- state.tanks_on = 1
- WIDGET_CONTROL,sEvent.id,SET_VALUE='Tanks (on)'
- endelse
-
- ; Update the view.
- ;
- state.tanks->SetProperty, HIDE=hide
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of TANKS
-
- ; Hide or show the enclosing box.
- ;
- 'BOX' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- if (state.box_on EQ 1) then begin ; Currently ON so turn OFF
- HIDE=1
- state.box_on = 0
- WIDGET_CONTROL,sEvent.id, SET_VALUE='BoundingBox (off)'
- endif else begin ; Currently OFF so turn ON
- HIDE=0
- state.box_on = 1
- WIDGET_CONTROL,sEvent.id, SET_VALUE='BoundingBox (on)'
- endelse
-
- ; Update the view.
- ;
- state.bounds->SetProperty, HIDE=hide
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of BOX
-
- ; Hide or show the light icons.
- ;
- 'LITES' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- if (state.lite_on EQ 1) then begin ; Currently ON so turn OFF
- HIDE=1
- state.lite_on = 0
- WIDGET_CONTROL,sEvent.id, SET_VALUE='Light Icons (off)'
- endif else begin ; Currently OFF so turn ON
- HIDE=0
- state.lite_on = 1
- WIDGET_CONTROL,sEvent.id, SET_VALUE='Light Icons (on)'
- end
-
- ; Update the view.
- ;
- state.lite1_icon->SetProperty, HIDE=hide
- state.lite2_icon->SetProperty, HIDE=hide
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of LITES
-
- ; Hide or show the text annotation.
- ;
- 'ANNO' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- if (state.text_on EQ 1) then begin ; Currently ON so turn OFF
- HIDE=1
- state.text_on = 0
- WIDGET_CONTROL,sEvent.id, SET_VALUE='Annotation (off)'
- endif else begin ; Currently OFF so turn ON
- HIDE=0
- state.text_on = 1
- WIDGET_CONTROL,sEvent.id, SET_VALUE='Annotation (on)'
- end
-
- ; Update the view.
- ;
- state.annotation->SetProperty, HIDE=hide
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of LITES
-
- ; Set the drag quality to low.
- ;
- 'LOW': begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- state.dragq = 0
- WIDGET_CONTROL, state.wDragLowButton, SENSITIVE=0
- WIDGET_CONTROL, state.wDragHiButton, SENSITIVE=1
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end; Case of LOW
-
- ; Set the drag quality to high.
- ;
- 'HIGH': begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- state.dragq = 2
- WIDGET_CONTROL, state.wDragLowButton, SENSITIVE=1
- WIDGET_CONTROL, state.wDragHiButton, SENSITIVE=0
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end; Case of HIGH
-
- ; Reset the initial orientation of the view.
- ;
- 'RESET' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- ident = [[1.0,0,0,0], $
- [0.0,1,0,0], $
- [0.0,0,1,0], $
- [0.0,0,0,1]]
- state.top3D->SetProperty, TRANSFORM=ident
- state.oWindow->Draw, state.oView
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end
-
- endcase ; of uval
-
- end ; end of em_view_event
-
- ;----------------------------------------------------------------------------
- ;
- ; Purpose: Main menu event handler
- ;
- pro d_tankleak_event, $
- sEvent
-
- ; Quit the application using the close box.
- ;
- if (TAG_NAMES(sEvent, /STRUCTURE_NAME) EQ $
- 'WIDGET_KILL_REQUEST') then begin
- WIDGET_CONTROL, sEvent.top, /DESTROY
- RETURN
- endif
-
- WIDGET_CONTROL, sEvent.id, GET_UVALUE=uval
-
- case uval of
-
- ; Recompute the isosurface with an new value and display it.
- ;
- 'ISOVAL': begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
-
- textChange = ['void','comp1','comp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- value = FLOAT(sEvent.value)
- em_gen_iso, *state.ivol_ptr, *state.cvol_ptr, $
- value, state.low, $
- iso_verts, iso_polys, iso_color
-
- ; Check for isodurface errors.
- ;
- if (N_ELEMENTS(iso_verts) EQ 0) then begin
- PRINT, 'Leaky_Tanks: Error in computing ' + $
- 'isosurface, check iso_value.'
- WIDGET_CONTROL, state.wSlider, $
- SET_VALUE=state.previousSliderValue
- state.iso_value = state.previousSliderValue
- endif else begin
- if (state.color_model EQ 0) then begin
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=0, COLOR=[255,0,255]
- endif else begin
- vert_colors = index_color2rgb(iso_color, 225.0)
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=vert_colors
- endelse ; else
- state.previousSliderValue = sEvent.value
- state.iso_value = sEvent.value
- endelse
-
- ; Redraw the view.
- ;
- WIDGET_CONTROL, state.wBase, /HOURGLASS
- state.oWindow->Draw, state.oView
-
- ; Rewrite the tip text.
- ;
- textChange = ['selecto','disp1','disp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of ISOVAL
-
- ; Show element 1.
- ;
- 'ELEM1' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
-
- textChange = ['void','comp1','comp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- em_gen_iso, state.volume1, *state.cvol_ptr, $
- state.iso_value, $
- state.low, iso_verts, iso_polys, iso_color
-
- ; Determine Color Model to Use.
- ;
- if (state.cvolume EQ 1) THEN color_model=0 else color_model=1
-
- if (N_ELEMENTS(iso_verts) EQ 0) then begin
- PRINT, 'Leaky_Tanks: Error in computing ' + $
- 'isosurface, check iso_value.'
- endif else begin
- if (color_model EQ 0) then begin
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=0, COLOR=[255,0,255]
- endif else begin
- vert_colors = index_color2rgb(iso_color, 225.0)
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=vert_colors
- endelse ; else
- endelse
-
- ; Update the State Values.
- ;
- state.ivolume = 1
- state.color_model = color_model
- *state.ivol_ptr = state.volume1
-
- ; Update the view.
- ;
- WIDGET_CONTROL, state.wBase, /HOURGLASS
- state.oWindow->Draw, state.oView
-
- textChange = ['selecto','disp1','disp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of ELEM1
-
- ; Show element 1.
- ;
- 'ELEM2' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
-
- textChange = ['void','comp1','comp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- em_gen_iso, state.volume2, *state.cvol_ptr, $
- state.iso_value, $
- state.low, iso_verts, iso_polys, iso_color
-
- ; Determine Color Model to Use.
- ;
- if (state.cvolume EQ 2) THEN color_model=0 else color_model=1
-
- if (N_ELEMENTS(iso_verts) EQ 0) then begin
- PRINT, 'Leaky_Tanks: Error in computing ' + $
- 'isosurface, check iso_value.'
- endif else begin
- if (color_model EQ 0) then begin
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=0, COLOR=[255,0,255]
- endif else begin
- vert_colors = index_color2rgb(iso_color, 225.0)
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=vert_colors
- endelse ; else
- endelse
-
- ; Update the State Values.
- ;
- state.ivolume = 2
- state.color_model = color_model
- *state.ivol_ptr = state.volume2
-
- ; Update the view.
- ;
- WIDGET_CONTROL, state.wBase, /HOURGLASS
- state.oWindow->Draw, state.oView
-
- textChange = ['selecto','disp1','disp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of ELEM2
-
- ; Set the color of element 1 ( one color or multiple colors).
- ;
- 'COLOR_ELEM1' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
- textChange = ['void','comp1','comp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- em_gen_iso, *state.ivol_ptr, state.volume1, $
- state.iso_value, $
- state.low, iso_verts, iso_polys, iso_color
-
- ; Determine Color Model to Use.
- ;
- if (state.ivolume EQ 1) THEN color_model=0 else color_model=1
-
- if (N_ELEMENTS(iso_verts) EQ 0) then begin
- PRINT, 'Leaky_Tanks: Error in computing ' + $
- 'isosurface, check iso_value.'
- endif else begin
- if (color_model EQ 0) then begin
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=0, COLOR=[255,0,255]
- endif else begin
- vert_colors = index_color2rgb(iso_color, 225.0)
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=vert_colors
- endelse ; else
- endelse
-
- ; Update the State Values.
- ;
- state.cvolume = 1
- state.color_model = color_model
- *state.cvol_ptr = state.volume1
-
- ; Update the view.
- ;
- WIDGET_CONTROL, state.wBase, /HOURGLASS
- state.oWindow->Draw,state.oView
- textChange = ['selecto','disp1','disp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of COLOR_ELEM1
-
- ; Set the color of element 1 ( one color or multiple colors).
- ;
- 'COLOR_ELEM2' : begin
- WIDGET_CONTROL, sEvent.top, GET_UVALUE=state, /NO_COPY
- WIDGET_CONTROL, state.wBase, SENSITIVE=0
-
- textChange = ['void','comp1','comp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- em_gen_iso, *state.ivol_ptr, state.volume2, state.iso_value, $
- state.low, iso_verts, iso_polys, iso_color
-
- ; Determine Color Model to Use.
- ;
- if (state.ivolume EQ 2) THEN color_model=0 else color_model=1
-
- if (N_ELEMENTS(iso_verts) EQ 0) then begin
- PRINT, 'Leaky_Tanks: Error in computing ' + $
- 'isosurface, check iso_value.'
- endif else begin
- if (color_model EQ 0) then begin
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=0, COLOR=[255,0,255]
- endif else begin
- vert_colors = index_color2rgb(iso_color, 225.0)
- state.isosurface1->SetProperty, DATA=iso_verts, $
- POLYGONS=iso_polys, VERT_COLORS=vert_colors
- endelse ; else
- endelse
-
- ; Update the State Values.
- ;
- state.cvolume = 2
- state.color_model = color_model
- *state.cvol_ptr = state.volume2
-
- ; Update the view.
- ;
- WIDGET_CONTROL, state.wBase, /HOURGLASS
- state.oWindow->Draw,state.oView
-
- textChange = ['selecto','disp1','disp2']
- putTips, state.sText, state.wText[1], $
- textChange, [0,1,2]
-
- WIDGET_CONTROL, state.wBase, SENSITIVE=1
- WIDGET_CONTROL, sEvent.top, SET_UVALUE=state, /NO_COPY
- end ; Case of COLOR_ELEM2
-
- endcase
- end
-
- ;-----------------------------------------------------------------
- ;
- ; PURPOSE : Cleanup procedure, restore colortable, destroy objects.
- ;
- pro d_tankleak_Cleanup, wBase
-
- WIDGET_CONTROL, wBase, GET_UVALUE=state, /NO_COPY
-
- ; Destroy the top objects
- ;
- OBJ_DESTROY, state.oView
- OBJ_DESTROY, state.f
- OBJ_DESTROY, state.font
- OBJ_DESTROY, state.font_small
- OBJ_DESTROY, state.font_medium
- OBJ_DESTROY, state.font_large
- OBJ_DESTROY, state.oContainer
- OBJ_DESTROY, state.oTrack
- OBJ_DESTROY, state.oText
- OBJ_DESTROY, state.oFont
- PTR_FREE, state.ivol_ptr
- PTR_FREE, state.cvol_ptr
-
- ; Restore the color table.
- ;
- TVLCT, state.colorTable
-
- if WIDGET_INFO(state.groupBase, /VALID_ID) then $
- WIDGET_CONTROL, state.groupBase, /MAP
-
- end ; of D_Tankleak_Cleanup
-
- ;-----------------------------------------------------------------
- ;
- ; PURPOSE : Main procedure.
- ;
- pro d_tankleak, $
- xdim=xdim, $ ; IN: (opt) x dimension of the viewing area.
- ydim=ydim, $ ; IN: (opt) y dimension of the viewing area.
- GROUP=group, $ ; IN: (opt) group identifier
- APPTLB = appTLB ; OUT: (opt) TLB of this application
-
- ; Check the validity of the group identifier.
- ;
- ngroup = N_ELEMENTS(group)
- if (ngroup NE 0) then begin
- check = WIDGET_INFO(group, /VALID_ID)
- if (check NE 1) then begin
- print,'Error, the group identifier is not valid'
- print, 'Return to the main application'
- RETURN
- endif
- groupBase = group
- endif else groupBase = 0L
-
- ; Get the current color vectors to restore
- ; when this application is exited.
- ;
- TVLCT, savedR, savedG, savedB, /GET
-
- ; Build color table from color vectors.
- ;
- colorTable = [[savedR],[savedG],[savedB]]
-
-
- ; Determine the screen size.
- ;
- Device, GET_SCREEN_SIZE = screenSize
-
- ; Set default values of the veiwing area size if not porvided.
- ;
- if (N_ELEMENTS(xdim) EQ 0) then begin
- xdim = screenSize[0]*0.6
- endif
- if (N_ELEMENTS(ydim) EQ 0) then begin
- ydim = 0.8 * xdim
- endif
-
- ; Restore the Volume Save Files so max and min are available
- ; for use when building cw_fslider.
- ;
- vol1_file = filepath('vol1.sav', $
- SUBDIR=['examples','demo','demodata'])
- vol2_file = filepath('vol2.sav', $
- SUBDIR=['examples','demo','demodata'])
-
- restore, vol1_file
- restore, vol2_file
-
- vol_min = MIN(volume1, max=vol_max)
- vol_min2 = MIN(volume2, max=vol_max2)
- vol_min = vol_min > vol_min2
- vol_max = fix((vol_max < vol_max2) * 0.95)
-
- ; Get the tips.
- ;
- sText = getTips(filepath('tankleak.tip', $
- SUBDIR=['examples','demo', 'demotext']) )
-
- ; Create the widgets starting with the top level base.
- ;
- if (N_ELEMENTS(group) EQ 0) then begin
- wBase = WIDGET_BASE(/COLUMN, $
- TITLE="Environmental Modeling Visualization", $
- YPAD=0, XPAD=0, $
- /TLB_KILL_REQUEST_EVENTS, $
- TLB_FRAME_ATTR=1, MBAR=mbarbase )
- endif else begin
- wBase = WIDGET_BASE(/COLUMN, $
- GROUP_LEADER=group, $
- TITLE="Environmental Modeling Visualization", $
- YPAD=0, XPAD=0, $
- /TLB_KILL_REQUEST_EVENTS, $
- TLB_FRAME_ATTR=1, MBAR=mbarbase)
- endelse
-
- ; Create the Menu Bar
-
- ; Create the file menu bar item that contains the quit button
- ;
- wFileButton = WIDGET_BUTTON(mbarbase,VALUE='File',/MENU)
-
- wQuitButton = WIDGET_BUTTON(wFileButton, $
- VALUE = 'Quit',UVALUE='QUIT', $
- EVENT_PRO='em_menu_event')
-
- ; Create the option menu
- ;
- wOptionButton = WIDGET_BUTTON(mbarbase, $
- VALUE='Isosurface', /MENU)
-
- ; Create the Shading Options Button.
- ;
- wShadingButton = WIDGET_BUTTON(wOptionButton, $
- EVENT_PRO='em_option_event', $
- VALUE='Shading',UVALUE='Shading',/MENU)
-
- wFlatButton = WIDGET_BUTTON(wShadingButton, $
- EVENT_PRO='em_option_event', $
- VALUE='Flat',UVALUE='FLAT')
-
- wGouraudButton = WIDGET_BUTTON(wShadingButton, $
- EVENT_PRO='em_option_event', $
- VALUE='Gouraud',UVALUE='GOURAUD')
-
- ; Create the Style Options Button.
- ;
- wStyleButton = WIDGET_BUTTON(wOptionButton, $
- EVENT_PRO='em_option_event', $
- VALUE='Style',UVALUE='STYLE',/MENU)
-
- wWireButton = WIDGET_BUTTON(wStyleButton, $
- EVENT_PRO='em_option_event', $
- VALUE='Wire',UVALUE='WIRE')
-
- wSolidButton = WIDGET_BUTTON(wStyleButton, $
- EVENT_PRO='em_option_event', $
- VALUE='Solid',UVALUE='SOLID')
-
- ; Create the View Menu.
- ;
- wViewButton = WIDGET_BUTTON(mbarbase,VALUE='View',/Menu)
-
- ; Create the Object Visibility Button.
- ;
- wObjVizButton = WIDGET_BUTTON(wViewButton, $
- EVENT_PRO='em_view_event', $
- VALUE='Show Object', UVALUE='OBJVIZ',/MENU)
-
- wIsoButton = WIDGET_BUTTON(wObjVizButton, $
- EVENT_PRO='em_view_event', $
- VALUE='Isosurface (on)',UVALUE='ISO')
-
- wBoreButton = WIDGET_BUTTON(wObjVizButton, $
- EVENT_PRO='em_view_event', $
- VALUE='BoreHoles (on)',UVALUE='BORES')
-
- wTanksButton = WIDGET_BUTTON(wObjVizButton, $
- EVENT_PRO='em_view_event', $
- VALUE='Tanks (on)',UVALUE='TANKS')
-
- wBoxButton = WIDGET_BUTTON(wObjVizButton, $
- EVENT_PRO='em_view_event', $
- VALUE='Bounding Box (on)',UVALUE='BOX')
-
- wLiteButton = WIDGET_BUTTON(wObjVizButton, $
- EVENT_PRO='em_view_event', $
- VALUE='Light Icons (off)',UVALUE='LITES')
-
- ; Create the Drag Quality Options Button
- ;
- wDragButton = WIDGET_BUTTON(wViewButton, $
- EVENT_PRO='em_view_event', $
- VALUE='Drag Quality', UVALUE='DRAG',/MENU)
-
- wDragLowButton = WIDGET_BUTTON(wDragButton, $
- EVENT_PRO='em_view_event', $
- VALUE='Low',UVALUE='LOW')
-
- wDragHiButton = WIDGET_BUTTON(wDragButton, $
- EVENT_PRO='em_view_event', $
- VALUE='High',UVALUE='HIGH')
-
- ; Create the transform reset button
- ;
- wResetMenu = WIDGET_BUTTON(wViewButton, $
- EVENT_PRO='em_view_event', $
- VALUE='Reset', /MENU)
-
- wResetButton = WIDGET_BUTTON(wResetMenu, $
- EVENT_PRO='em_view_event', $
- VALUE='Reset Orientation',UVALUE='RESET')
-
- ; Create the help/About button.
- ;
- wHelpButton = WIDGET_BUTTON(mbarbase, $
- VALUE='About', /HELP, /MENU)
-
- wAboutButton = WIDGET_BUTTON(wHelpButton, $
- EVENT_PRO = 'em_menu_event', $
- VALUE='About Environmental Modeling', UVALUE='INFO')
-
- ; Create the first child of the top level base (wBase).
- ;
- wTopRowBase = WIDGET_BASE(wBase, COLUMN=2)
-
- ; Create a base for the left column
- ;
- wLeftBase = WIDGET_BASE(wTopRowBase, $
- /BASE_ALIGN_LEFT, /COLUMN, /FRAME)
-
- ; Create the Element Selection Area.
- ;
- wElemBase = WIDGET_BASE(wLeftBase, /COLUMN, /FRAME)
-
- wIsoLabel1 = WIDGET_LABEL(wElemBase, $
- VALUE="Element Selections", $
- /ALIGN_CENTER)
-
- wIsoLabel2 = WIDGET_LABEL(wElemBase, $
- VALUE="Isosurface:", /ALIGN_LEFT)
-
- wElemIsoBase = WIDGET_BASE(wElemBase, $
- /COLUMN, /EXCLUSIVE)
-
- wElem1Toggle = WIDGET_BUTTON(wElemIsoBase, $
- VALUE="Element 1", $
- UVALUE='ELEM1', /NO_RELEASE, $
- EVENT_PRO='d_tankleak_event')
-
- wElem2Toggle = WIDGET_BUTTON(wElemIsoBase, $
- VALUE="Element 2", $
- UVALUE='ELEM2', /NO_RELEASE, $
- EVENT_PRO='d_tankleak_event')
-
- wIsoLabel3 = WIDGET_LABEL(wElemBase, $
- VALUE="Shaded Colors:", /align_left)
-
- wColorIsoBase = WIDGET_BASE(wElemBase, $
- /COLUMN, /EXCLUSIVE)
-
- wColor1Toggle = WIDGET_BUTTON(wColorIsoBase, $
- VALUE="Element 1", $
- UVALUE='COLOR_ELEM1', /NO_RELEASE, $
- EVENT_PRO='d_tankleak_event')
-
- wColor2Toggle = WIDGET_BUTTON(wColorIsoBase, $
- VALUE="Element 2", $
- UVALUE='COLOR_ELEM2', /NO_RELEASE, $
- EVENT_PRO='d_tankleak_event')
-
- ; Create the SLIDER for the Isosurface Level
- ;
- wIsoBase = WIDGET_BASE(wLeftBase, /COLUMN, /FRAME)
-
- wIsoLabel = WIDGET_LABEL(wIsoBase, $
- VALUE="Isosurface Controls", $
- /ALIGN_CENTER)
-
- maxValue = FIX(vol_max)
- wSlider = WIDGET_SLIDER(wIsoBase, $
- VALUE=maxVAlue/2, $
- MINIMUM=2, MAXIMUM=maxValue, $
- UVALUE='ISOVAL')
-
- ; Create a base for the right column.
- ;
- wRightBase = WIDGET_BASE(wTopRowBase, Column=1, /Frame)
-
- wDraw3D = widget_draw(wRightBase, $
- XSIZE=xdim, YSIZE=ydim, /BUTTON_EVENTS, $
- UVALUE='DRAW', RETAIN=0, $
- EVENT_PRO='em_win3d_event', /EXPOSE_EVENTS, $
- GRAPHICS_LEVEL=2)
-
- ; Create the tip widgets.
- ;
- wStatusBase = WIDGET_BASE(wBase, MAP=0, /ROW)
-
- nWidgets = 2
- wText = LONARR(nWidgets)
- widTips, wStatusBase, sText.text, XSIZE=36, $
- YSIZE=3, NWIDGETS=nWidgets, wText
-
- ; All the widget have been created, now realize them
- ;
- WIDGET_CONTROL, wBase, /REALIZE
-
- WIDGET_CONTROL, /HOURGLASS
-
- ; Returns the top level base to the APPTLB keyword.
- ;
- appTLB = wBase
-
- ; Size the tips widgets.
- ;
- sizeTips, wBase, wText, wStatusBase
-
- WIDGET_CONTROL, wDraw3D, GET_VALUE=oWindow
-
- ; Set the state of the buttons.
- ;
- WIDGET_CONTROL, wElem1Toggle, SET_BUTTON=1
- WIDGET_CONTROL, wColor1Toggle, SET_BUTTON=1
-
- ; Initialize the previous slider value to its actual value.
- ;
- previousSliderValue = (vol_max -vol_min) / 2.0
-
- ; Create the identity matrix for transforms.
- ;
- ident = [[1.0,0,0,0], $
- [0.0,1,0,0], $
- [0.0,0,1,0], $
- [0.0,0,0,1]]
-
- ; Define a few working colors.
- ;
- white = [255,255,255]
- red = [255,0,0]
- green = [0,255,0]
- blue = [0,0,255]
- purple = [255,0,255]
-
- ; Define the Graphics View.
- ;
-
- oView = OBJ_NEW('IDLgrView', COLOR=[0,0,0], PROJECTION=1, $
- EYE= 51.0, $
- VIEWPLANE_RECT=[-50,-50,100,100], ZCLIP = [50, -100])
-
- ; Create a centerd starting up text.
- ;
- myview = [-50, -50, 100, 100]
- textLocation = [myview[0]+0.5*myview[2], myview[1]+0.5*myview[3]]
-
- ; Create and display the PLEASE WAIT text.
- ;
- oFont = OBJ_NEW('IDLgrFont', 'Helvetica', SIZE=18)
- oText = OBJ_NEW('IDLgrText', $
- 'Starting up Please wait...', $
- ALIGN=0.5, $
- LOCATION=textLocation, $
- COLOR=[255,255,0], FONT=oFont)
-
-
- ; Prepare for the PLEASE WAIT text.
- ;
- ; Add the temporary top object to the view.
- ;
- top_tmp = OBJ_NEW('IDLgrModel')
- oView->Add, top_tmp
-
- top_tmp->Add, oText
-
- oWindow->Draw, oView
-
- ; Define top level model.
- ;
- top = OBJ_NEW('IDLgrModel')
-
- ; Scale the top model.
- ;
- sct = 0.8
- top->Scale, sct, sct, sct
-
- WIDGET_CONTROL, /HOURGLASS
-
- ; Rotate the top model.
- ;
- top->Rotate, [1,0,0], -30
- top->Rotate, [0,1,0], 15
-
- ; top3D is the top object for transformable objects.
- ;
- top3D = OBJ_NEW('IDLgrModel')
- top->Add, top3D
-
- ; Add the top object to the view.
- ;
- oView->Add, top
-
- ; Draw the Text and Title.
- ;
- font_small = OBJ_NEW('IDLgrFont', 'Helvetica', SIZE=16. )
- font_medium = OBJ_NEW('IDLgrFont', 'Helvetica', SIZE=18. )
- font_large = OBJ_NEW('IDLgrFont', 'Helvetica', SIZE=24. )
-
- annotation = OBJ_NEW('IDLgrModel')
- top->Add, annotation
-
- if (screenSize[0] EQ 640) THEN font=font_small else font = font_large
-
- ; Add the Wait Text for computing Isosurfaces.
- ;
- iso_text = OBJ_NEW('IDLgrModel')
-
- iso_text1 = OBJ_NEW('IDLgrText', $
- 'COMPUTING NEW ISOSURFACE:', $
- LOCATION=[-40,-35], $
- COLOR=[255,0,0], FONT=font)
-
- iso_text2 = OBJ_NEW('IDLgrText', $
- 'Please Wait ...', $
- LOCATION= [-20,-41], $
- COLOR=[255,0,0], FONT=font)
-
- iso_text->Add, iso_text1
- iso_text->Add, iso_text2
- top->Add, iso_text
- iso_text->SetProperty, HIDE=1
-
- ; Draw the red bounding box.
- ;
- extents = [-40.0, 40.0, -20.0, 20.0, -20.0, 0.0]
- bounds = em_extent_bounds(extents, top3D, red, green, blue)
-
- ; Generate the Storage Tank Data.
- ;
- tank_points = [[0.0,0.0,-4.0],$
- [5.0,0.0,-4.0],$
- [5.0,0.0,4.0],$
- [0.0,0.0,4.0]]
-
- mesh_obj, 6, tank_verts, tank_polys, tank_points, p1=16
-
- tank_points1 = [[0.0,0.0,-4.0],$
- [5.0,0.0,-4.0],$
- [5.0,0.0,4.0],$
- [4.0,0.0,5.0],$
- [1.0,0.0,5.0],$
- [0.0,0.0,4.0]]
- mesh_obj, 6, tank_verts1, tank_polys1, tank_points1, p1=16
-
- ; Generate the Graphics Objects for the Storage Tank Field.
- ;
- tanks = OBJ_NEW('IDLgrModel')
- top3D->Add, tanks
-
- ; Tank #1.
- ;
- tank1 = OBJ_NEW('IDLgrModel')
- tanks->Add, tank1
- tank1_poly = OBJ_NEW('IDLgrPolygon', tank_verts1, poly=tank_polys1, $
- COLOR=white)
- tank1->Add, tank1_poly
-
- ; Tank #2.
- ;
- tank2 = OBJ_NEW('IDLgrModel')
- tanks->Add, tank2
- tank2_poly = OBJ_NEW('IDLgrPolygon', SHARE_DATA=tank1_poly, $
- POLYGONS=tank_polys1, COLOR=white)
- tank2->Add, tank2_poly
-
- ; Tank #3.
- ;
- tank3 = OBJ_NEW('IDLgrModel')
- tanks->Add, tank3
- tank3_poly = OBJ_NEW('IDLgrPolygon', share_data=tank1_poly, $
- POLYGONS=tank_polys1, COLOR=white)
- tank3->Add, tank3_poly
-
- ; Tank #4.
- ;
- tank4 = OBJ_NEW('IDLgrModel')
- tanks->Add, tank4
- tank4_poly = OBJ_NEW('IDLgrPolygon', share_data=tank1_poly, $
- POLYGONS=tank_polys1, COLOR=white)
- tank4->Add, tank4_poly
-
- ; Tank #5.
- ;
- tank5 = OBJ_NEW('IDLgrModel')
- tanks->Add, tank5
- tank5_poly = OBJ_NEW('IDLgrPolygon', share_data=tank1_poly, $
- POLYGONS=tank_polys1, COLOR=white)
- tank5->Add, tank5_poly
-
- ; Translate each tank into place.
- ;
- z_depth = -8.0
- tank1->Translate, -24.0, 8.0, z_depth
- tank2->Translate, 0.0, 8.0, z_depth
- tank3->Translate, 24.0, 8.0, z_depth
- tank4->Translate, -12.0, -8.0, z_depth
- tank5->Translate, 12.0, -8.0, z_depth
-
- ; Read the borehole data from: bores.dat.
- ;
- bore_file = filepath('bores0.dat', $
- SUBDIR=['examples','demo','demodata'])
- OPENR, bore_lun, bore_file, /GET_LUN
- bore_obj = read_bores(bore_lun, top3D, purple)
- CLOSE, bore_lun
- FREE_LUN, bore_lun
-
- ; Generate the first isosurface.
- ;
- iso_COLOR=FLTARR(80,40,20)
- iso_value = (vol_max - vol_min) / 2.0
-
- WIDGET_CONTROL, wSlider, SET_VALUE=iso_value
-
- color_model = 0
- low = 1
- em_gen_iso, volume1, volume1, iso_value, low, iso_verts, $
- iso_polys, iso_color
-
- iso_model1 = OBJ_NEW('IDLgrModel')
- top3D->Add, iso_model1
-
- if (color_model EQ 0) then begin
- isosurface1 = OBJ_NEW('IDLgrPolygon', iso_verts, $
- POLYGONS=iso_polys, $
- COLOR=[250,0,250])
- endif else begin
- vert_colors = index_color2rgb(iso_color, 225.0)
- isosurface1 = OBJ_NEW('IDLgrPolygon', iso_verts, $
- POLYGONS=iso_polys, $
- vert_COLOR=vert_colors)
- endelse ; else
-
- iso_model1->Add, isosurface1
- iso_model1->translate, -40.0, -20.0, -20.0 ; Translate into place
-
- ; Get and Set properties on the bounds of the geometry.
- ;
- xr = [extents[0],extents[1]]
- yr = [extents[2],extents[3]]
- zr = [extents[4],extents[5]]
-
- ; Generate the light sources.
- ;
- li_xverts = [-1.0, 1.0, 0.0, 0.0, 0.0, 0.0]
- li_yverts = [0.0, 0.0, 1.0, -1.0, 0.0, 0.0]
- li_zverts = [0.0, 0.0, 0.0, 0.0, 1.0, -1.0]
- li_pl = [2,0,1,$
- 2,2,3,$
- 2,4,5]
-
- ; Generate an ambient light source.
- ;
- lite0 = OBJ_NEW('IDLgrLight', TYPE=0, COLOR=[128,128,128])
- top->Add, lite0
-
- ; Generate the first light source.
- ;
- lite1_icon = OBJ_NEW('IDLgrModel')
- top->Add,lite1_icon
- lite1_x = 40.0
- lite1_y = -20.0
- lite1_z = 10.0
- lite1_icon_pl = OBJ_NEW('IDLgrPolyline',li_xverts,li_yverts,li_zverts,$
- POLYLINES=li_pl, COLOR=white)
-
- lite1_icon->Add,lite1_icon_pl
- lite1_icon->Translate, lite1_x, lite1_y, lite1_z
-
- ; Add a Positional Light type = 1.
- ;
- lite1 = OBJ_NEW('IDLgrLight', $
- LOCATION=[lite1_x, lite1_y, lite1_z], TYPE=1)
- top->Add,lite1
-
- ; Generate the second light source.
- ;
- lite2_icon = OBJ_NEW('IDLgrModel')
- top->Add,lite2_icon
-
- lite2_x = -40.0
- lite2_y = -20.0
- lite2_z = 10.0
- lite2_icon_pl = OBJ_NEW('IDLgrPolyline', li_xverts, li_yverts, li_zverts,$
- POLYLINES=li_pl, COLOR=white)
- lite2_icon->Add,lite2_icon_pl
- lite2_icon->translate, lite2_x, lite2_y, lite2_z
-
- ; Add a Positional Light type = 1.
- ;
- lite2 = OBJ_NEW('IDLgrLight', $
- LOCATION=[lite2_x, lite2_y, lite2_z], TYPE=1)
- top->Add, lite2
-
- ; Initially turn the Light Icons Off.
- ;
- lite1_icon->SetProperty, HIDE=1
- lite2_icon->SetProperty, HIDE=1
-
-
- ; Set the initial state of objects (on or off).
- ;
- iso_on = 1
- bores_on = 1
- tanks_on = 1
- box_on = 1
- text_on = 1
- lite_on = 0
-
- ; Desensitive the initial settings.
- ;
- WIDGET_CONTROL, wDragLowButton, SENSITIVE=0
- WIDGET_CONTROL, wGouraudButton, SENSITIVE=0
- WIDGET_CONTROL, wSolidButton, SENSITIVE=0
-
- ; Define two text strings.
- ;
- displayText = 'The display is interactive with the left mouse button'
- computingText = 'Computing new isosurface: Please wait... '
-
- ; Add the trackball object for interactive change
- ; of the scene orientation.
- ;
- oTrack = OBJ_NEW('Trackball', [xdim/2.0, ydim/2.0], xdim/2.0)
-
- oContainer = OBJ_NEW('IDLgrContainer')
- oContainer->Add, oView
- oContainer->Add, oTrack
-
- state = {center: xdim/2., $ ; X Center of drawing area
- radius: ydim/2, $ ; Sphere radius (1/2 drawing area height)
- size_2: xdim/2., $ ; Shpere size (1/2 drawing area width)
- btndown: 0b, $ ; Mouse 0=not pressed, pressed otherwise
- wDraw3D: wDraw3D, $ ; Widget draw ID
- annotation: annotation, $ ; Annotation Model
- top3D: top3D, $ ; Topmodel for 3-D
- iso_text: iso_text, $ ; Model for isosurface text
- bounds: bounds, $ ; Box object
- lite1_icon: lite1_icon, $ ; Light icon 1 model
- lite2_icon: lite2_icon, $ ; Light icon 2 model
- bore_obj: bore_obj, $ ; Bore holes object
- tanks: tanks, $ ; Tanks model
- tank1_poly: tank1_poly, $ ; Tanks polyline objects
- tank2_poly: tank2_poly, $
- tank3_poly: tank3_poly, $
- tank4_poly: tank4_poly, $
- tank5_poly: tank5_poly, $
- isosurface1: isosurface1, $ ; Isosurface (polygon) object
- iso_value: iso_value, $ ; Isosurface value
- low: low, $ ; Show low values of the isosurface
- DisplayText: displayText, $ ; Text object
- ComputingText: computingText, $ ; 'Computing' string
- WBase: wBase, $ ; Top level base
- WWireButton: wWireButton, $ ; Functionality buttons
- WSolidButton: wSolidButton, $
- WDragHiButton: wDragHiButton, $
- WDragLowButton: wDragLowButton, $
- WFlatButton: wFlatButton, $
- WGouraudButton: wGouraudButton, $
- WSlider: wSlider, $ ; Isosurface value slider
- OTrack: oTrack, $ ; Trackball object
- OContainer: oContainer, $ ; Container object
- volume1: volume1, $ ; Volume data of element 1
- volume2: volume2, $ ; Volume data of element 2
- ivol_ptr: ptr_new(volume1), $ ; Pointer ot volume data 1
- cvol_ptr: ptr_new(volume1), $ ; Pointer ot volume data 2
- ivolume: 1, $ ; Current volume for element x
- cvolume: 1, $ ; Current color for element x
- color_model: color_model, $ ; Color model
- iso_verts: iso_verts, $ ; Isosurface vertices
- iso_polys: iso_polys, $ ; Isosurface polylines coordinates
- iso_color: iso_color, $ ; Isosurface color vertex
- iso_on: iso_on, $ ; Object : 0= hide, 1 = showing
- bores_on: bores_on, $
- tanks_on: tanks_on, $
- box_on: box_on, $
- text_on: text_on, $
- lite_on: lite_on, $
- OView: oView, $ ; View object
- f: font, $ ; Font objects
- Font: font, $
- Font_small: font_small, $
- Font_medium: font_medium, $
- Font_large: font_large, $
- ColorTable: colortable, $ ; Color table to restore
- dragq : 0, $ ; Drag quality: 0=low, 1=med., 2=high
- PreviousSliderValue: previousSliderValue, $ : As is
- WText: wText, $ ; Widget text IDs for tips
- SText: sText, $ ; Text structure for tips
- OText: oText, $ ; Text object
- OFont: oFont, $ ; Font object
- OWindow: oWindow, $ ; Window object
- groupBase: groupBase $ ; Base of Group Leader
- }
-
- ; Set the isosurface shading to Gouraud.
- ;
- isosurface1->SetProperty, SHADING=1
-
- ; Draw the screen. Remove the starting up text.
- ;
- top_tmp->Remove, oText
- oWindow->Draw, oView
-
- WIDGET_CONTROL, wBase, SET_UVALUE=state, /NO_COPY
-
- XMANAGER, 'd_tankleak', wBase, $
- /NO_BLOCK, $
- CLEANUP='d_tankleak_Cleanup'
-
- end ; D_Tankleak
-